# 单线程以及多线程变同步执行
import time
from threading import Thread, Lock


def funa():
    print('开始上语文课了')
    time.sleep(5)
    print('上课结束了')


def funb():
    print('开始上数学课了')
    time.sleep(3)
    print('上课结束了')


li = []


def wdata():
    for i in range(5):
        li.append(i)
        time.sleep(0.5)
    print('现在的li是这样的：', li)


def rdata():
    print('读取li的数据：', li)


a = 0
b = 10000000


def add():
    for i in range(b):
        global a
        a += 1
    print('a的值：', a)


# 定义互斥锁
lock = Lock()


def add2():
    # 加锁
    lock.acquire()
    for i in range(b):
        global a
        a += 1
    print('a的值：', a)
    # 解锁，加锁后一定要解锁，否则其他线程无法访问该资源
    lock.release()


if __name__ == '__main__':  # 相当于是python模拟程序入口，表示执行运行时，执行下面的代码
    funa()
    funb()

    # 创建写入线程
    wd = Thread(target=wdata)
    # 创建读取线程
    rd = Thread(target=rdata)
    # 开启线程
    wd.start()
    # 阻塞线程,等待该线程执行完毕再继续执行
    wd.join()
    rd.start()
    rd.join()
    print('程序结束')

    t1 = Thread(target=add)
    t2 = Thread(target=add)
    t1.start()
    t1.join()
    t2.start()
    t2.join()

    t3 = Thread(target=add2)
    t4 = Thread(target=add2)
    t3.start()
    t4.start()
